package br.com.devteam.sgap.view.interno;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;

import br.com.devteam.base.util.Message;
import br.com.devteam.base.util.SGAPContantes;
import br.com.devteam.sgap.model.Perfil;
import br.com.devteam.sgap.model.Usuario;
import br.com.devteam.sgap.service.IService;

@Controller(value = "MBeanManterUsuario")
@Scope(value = "session")
public class MbeanManterUsuario {

	@Autowired
	private IService service;

	private Usuario usuario;
	private Perfil perfil;
	private List<Usuario> usuarios;
	private List<Perfil> perfis;

	private boolean cadastrando;
	private String confirmaSenha;
	private String busca;
	private String email;

	private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
			+ "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";

	public MbeanManterUsuario() {
	}

	public String actionCarregarFiltro() {

		try {
			busca = new String();
			carregarUsuarios();
		} catch (Exception e) {
			e.printStackTrace();
			Message.e(SGAPContantes.MESSAGE_FIELD, SGAPContantes.ERROR_GENERIC);
			Message.manterMensagensRedirect();
		}

		return SGAPContantes.PAGE_FILTER_USUARIO;
	}

	public String actionPrepararCadastro() {
		usuario = new Usuario();
		busca = new String();
		usuario.setEnable(true);

		perfil = null;
		cadastrando = true;

		perfis = new ArrayList<Perfil>();
		perfis.add(new Perfil(Perfil.PERFIL_ADMINISTRADOR));
		perfis.add(new Perfil(Perfil.PERFIL_ALUNO));
		perfis.add(new Perfil(Perfil.PERFIL_ASSISTENTE));
		perfis.add(new Perfil(Perfil.PERFIL_PROFESSOR));

		return SGAPContantes.PAGE_REGISTER_USUARIO;
	}

	private void carregarUsuarios() throws Exception {
		usuarios = service.findByNamedQuery(Usuario.QUERY_LIST_ASC_ORDER);
	}

	@Transactional
	public String actionSalvar() {

		if (validar()) {
			try {
				perfil.setUsuario(usuario);
				perfil.setLogin(usuario.getLogin());

				if (isCadastrando()) {

					usuario.setPerfis(new ArrayList<Perfil>());
					usuario.getPerfis().add(perfil);

					service.save(usuario);
					Message.i(SGAPContantes.MESSAGE_FIELD,
							SGAPContantes.ENTRY_SAVE);
					Message.manterMensagensRedirect();
				} else {

					usuario.getPerfis().clear();
					usuario.getPerfis().add(perfil);

					service.update(usuario);
					Message.i(SGAPContantes.MESSAGE_FIELD,
							SGAPContantes.ENTRY_UPDATE);
					Message.manterMensagensRedirect();
				}
				cadastrando = false;

				carregarUsuarios();

				return SGAPContantes.PAGE_FILTER_USUARIO;
			} catch (Exception e) {
				e.printStackTrace();
				Message.e(SGAPContantes.MESSAGE_FIELD,
						SGAPContantes.ERROR_GENERIC);
			}
		}
		busca = new String();
		return "";
	}

	@Transactional
	public String actionExcluir(Usuario usuario) {
		try {
			usuario = service.findById(Usuario.class, usuario.getId());
			service.delete(usuario);
			Message.i(SGAPContantes.MESSAGE_FIELD, SGAPContantes.ENTRY_DELETE);
			Message.manterMensagensRedirect();
			return actionCarregarFiltro();
		} catch (Exception e) {
			e.printStackTrace();
			Message.e(SGAPContantes.MESSAGE_FIELD,
					SGAPContantes.ERROR_NOT_DELETED);
		}

		return "";
	}

	public String actionEditar(Usuario usuario) {
		this.usuario = usuario;
		cadastrando = false;
		perfil = this.usuario.getPerfis().get(0);

		perfis = new ArrayList<Perfil>();
		perfis.add(new Perfil(Perfil.PERFIL_ADMINISTRADOR));
		perfis.add(new Perfil(Perfil.PERFIL_ALUNO));
		perfis.add(new Perfil(Perfil.PERFIL_ASSISTENTE));
		perfis.add(new Perfil(Perfil.PERFIL_PROFESSOR));

		return SGAPContantes.PAGE_REGISTER_USUARIO;
	}

	public String actionPesquisar() throws Exception {
		if (busca == null || busca.isEmpty()) {
			carregarUsuarios();
		} else if (busca.length() < 2) {
			Message.e(SGAPContantes.MESSAGE_FIELD,
					SGAPContantes.ERROR_SHORT_SEARCH);
		} else {
			Map<String, Object> params = new HashMap<String, Object>();
			params.put("busca", "%" + busca + "%");

			usuarios = service.findByNamedQuery(Usuario.QUERY_SEARCH, params);

			if (usuarios.size() == 0) {
				Message.e(SGAPContantes.MESSAGE_FIELD,
						SGAPContantes.ERROR_SEARCH_NO_DATA);
			}
		}
		return "";
	}

	/**
	 * Ativa o usuário se o mesmo estiver inativo e dasativa o usuário se o
	 * mesmo estiver ativo.
	 * */
	@Transactional
	public String actionAtivarDesativarUsuario(Usuario usuario) {
		try {
			if (usuario.getEnable())
				usuario.destivarUsuario();
			else
				usuario.ativarUsuario();
			service.update(usuario);
			Message.i(SGAPContantes.MESSAGE_FIELD,
					(usuario.getEnable() ? SGAPContantes.ENTRY_ENABLE
							: SGAPContantes.ENTRY_DISABLE));
		} catch (Exception e) {
			e.printStackTrace();
			Message.e(SGAPContantes.MESSAGE_FIELD, SGAPContantes.ERROR_GENERIC);
		}

		return "";
	}

	public String actionCancelarCadastro() throws Exception {
		usuario = new Usuario();
		cadastrando = false;
		perfil = new Perfil();
		perfis = new ArrayList<Perfil>();
		carregarUsuarios();
		return "/pages/interno/usuario/usuario_filtro.xhtml?faces-redirect=true";//SGAPContantes.PAGE_FILTER_USUARIO;
	}

	private boolean validar() {

		boolean retorno = true;
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("login", usuario.getLogin());
		List<Usuario> usuarios = service.findByNamedQuery(
				Usuario.QUERY_LIST_BY_LOGIN, params);

		Map<String, Object> paramsEmail = new HashMap<String, Object>();
		paramsEmail.put("email", usuario.getEmail());
		List<Usuario> users = service.findByNamedQuery(Usuario.QUERY_EMAIL,
				paramsEmail);

		if (!users.isEmpty() && cadastrando == true) {
			if (usuario.getEmail().equals(users.get(0).getEmail())) {
				retorno = false;
				Message.e("email", SGAPContantes.ERROR_FORM_FIELD_EMAIL);
			}
		}

		if (usuario.getNome() == null || usuario.getNome().length() < 1) {
			retorno = false;
			Message.e("nome", SGAPContantes.ERROR_EMPTY_TEXT_FIELD);
		}

		if (!usuario.getEmail().matches(EMAIL_PATTERN)) {
			retorno = false;
			Message.e("email", "E-mail inválido");
		}

		if (usuario.getLogin() == null || usuario.getLogin().length() < 1) {
			retorno = false;
			Message.e("login", SGAPContantes.ERROR_EMPTY_TEXT_FIELD);
		} else {
			if (!usuarios.isEmpty()) {
				if (usuarios.get(0).getId() != usuario.getId()) {
					retorno = false;
					Message.e("login",
							"Este login já está sendo usado por outro usuário, por favor, escolher outro");
				}
			}
		}

		if (usuario.getSenha() == null || usuario.getSenha().length() < 1
				|| usuario.getSenha().equals("")) {
			if (cadastrando) {
				retorno = false;
				Message.e("senha", SGAPContantes.ERROR_EMPTY_TEXT_FIELD);
			}
		}

		if (confirmaSenha == null || confirmaSenha.length() < 1
				|| confirmaSenha.equals("")) {
			if (cadastrando) {
				retorno = false;
				Message.e("confirmaSenha", SGAPContantes.ERROR_EMPTY_TEXT_FIELD);
			} else {
				if (usuario.getSenha().length() > 0) {
					retorno = false;
					Message.e("confirmaSenha", "Senhas diferentes");
				}
			}
		} else if (!confirmaSenha.equals(usuario.getSenha())) {
			retorno = false;
			Message.e("confirmaSenha", "Senhas diferentes");
		}

		if (perfil == null) {
			retorno = false;
			Message.e("perfil", SGAPContantes.ERROR_EMPTY_TEXT_FIELD);
		}

		if (!retorno) {
			Message.e(SGAPContantes.MESSAGE_FIELD, SGAPContantes.ERROR_GENERIC);
		}

		return retorno;
	}

	public Usuario getUsuario() {
		if (usuario == null) {
			usuario = new Usuario();
		}
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Perfil getPerfil() {
		/*if (perfil == null) {
			perfil = new Perfil();
		}*/
		return perfil;
	}

	public void setPerfil(Perfil perfil) {
		this.perfil = perfil;
	}

	public List<Usuario> getUsuarios() {
		if(usuarios == null)
			usuarios = new ArrayList<Usuario>();
		return usuarios;
	}

	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

	public List<Perfil> getPerfis() {
		if(perfis == null)
			perfis = new ArrayList<Perfil>();
		return perfis;
	}

	public void setPerfis(List<Perfil> perfis) {
		this.perfis = perfis;
	}

	public boolean isCadastrando() {
		return cadastrando;
	}

	public void setCadastrando(boolean cadastrando) {
		this.cadastrando = cadastrando;
	}

	public String getConfirmaSenha() {
		return confirmaSenha;
	}

	public void setConfirmaSenha(String confirmaSenha) {
		this.confirmaSenha = confirmaSenha;
	}

	public String getBusca() {
		return busca;
	}

	public void setBusca(String busca) {
		this.busca = busca;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

}
